/*! JointJS v0.9.9 - JavaScript diagramming library  2016-05-31 


This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.

Contributors: Client.IO
			  Eurotech

 */
joint.shapes.devs = {};

joint.shapes.devs.Model = joint.shapes.basic.Generic
		.extend(_
				.extend(
						{},
						joint.shapes.basic.PortsModelInterface,
						{

							markup : '<g class="rotatable"><g class="scalable"><rect class="body"/></g><text class="label"/><g class="inPorts"/><g class="outPorts"/></g>',
							portMarkup : '<g class="port port<%= id %>"><circle class="port-body"/><text class="port-label"/></g>',

							defaults : joint.util.deepSupplement({

								type : 'devs.Model',
								size : {
									width : 1,
									height : 1
								},

								inPorts : [],
								outPorts : [],

								attrs : {
									'.' : {
										magnet : false
									},
									'.body' : {
										width : 150,
										height : 250,
										stroke : '#000000'
									},
									'.port-body' : {
										r : 10,
										magnet : true,
										stroke : '#000000'
									},
									text : {
										'pointer-events' : 'none'
									},
									'.label' : {
										text : 'Model',
										'ref-x' : .5,
										'ref-y' : 10,
										ref : '.body',
										'text-anchor' : 'middle',
										fill : '#000000'
									},
									'.inPorts .port-label' : {
										x : -15,
										dy : 4,
										'text-anchor' : 'end',
										fill : '#000000'
									},
									'.outPorts .port-label' : {
										x : 15,
										dy : 4,
										fill : '#000000'
									}
								}

							}, joint.shapes.basic.Generic.prototype.defaults),

							getPortAttrs : function(portName, index, total,
									selector, type) {

								var attrs = {};

								var portClass = 'port' + index;
								var portSelector = selector + '>.' + portClass;
								var portLabelSelector = portSelector
										+ '>.port-label';
								var portBodySelector = portSelector
										+ '>.port-body';

								attrs[portLabelSelector] = {
									text : portName
								};
								attrs[portBodySelector] = {
									port : {
										id : portName || _.uniqueId(type),
										type : type
									}
								};
								attrs[portSelector] = {
									ref : '.body',
									'ref-y' : (index + 0.5) * (1 / total)
								};

								if (selector === '.outPorts') {
									attrs[portSelector]['ref-dx'] = 0;
								}

								return attrs;
							}
						}));

joint.shapes.devs.Atomic = joint.shapes.devs.Model.extend({

	defaults : joint.util.deepSupplement({

		type : 'devs.Atomic',
		size : {
			width : 120,
			height : 40
		},
		attrs : {
			'.body' : {
				fill : '#009ae0'
			},
			'.inPorts .port-body' : {
				fill : 'PaleGreen',
				magnet : 'passive',
				type : 'input'
			},
			'.outPorts .port-body' : {
				fill : 'Tomato',
				type : 'output'
			}
		}

	}, joint.shapes.devs.Model.prototype.defaults)

});

joint.shapes.devs.Coupled = joint.shapes.devs.Model.extend({

	defaults : joint.util.deepSupplement({

		type : 'devs.Coupled',
		size : {
			width : 200,
			height : 300
		},
		attrs : {
			'.body' : {
				fill : 'seaGreen'
			},
			'.label' : {
				text : 'Coupled'
			},
			'.inPorts .port-body' : {
				fill : 'PaleGreen'
			},
			'.outPorts .port-body' : {
				fill : 'Tomato'
			}
		}

	}, joint.shapes.devs.Model.prototype.defaults)
});

joint.shapes.devs.Link = joint.dia.Link.extend({

	defaults : {
		type : 'devs.Link',
		attrs : {
			'.connection' : {
				'stroke' : '#4b4f6a',
				'stroke-width' : 2
			}
		}
	}
});

joint.shapes.devs.ModelView = joint.dia.ElementView
		.extend(joint.shapes.basic.PortsViewInterface);
joint.shapes.devs.AtomicView = joint.shapes.devs.ModelView;
joint.shapes.devs.CoupledView = joint.shapes.devs.ModelView;